package proxy;


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by fengtingxin on 2020/3/4.
 */
public class MyCglibProxy implements MethodInterceptor {

    private Enhancer enhancer = new Enhancer();

    // 这里的目标类型为Object，则可以接受任意一种参数作为被代理类，实现了动态代理
    public Object getInstance(Class clazz) {
        enhancer.setSuperclass(clazz);
        enhancer.setCallback(this);
        // 返回代理对象
        return enhancer.create();
    }

    @Override
    public Object intercept(Object proxy, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("==代理方法开始执行");
        Object result = methodProxy.invokeSuper(proxy, objects);
        System.out.println("==代理方法结束执行");
        return result;
    }

    public static void main(String[] args) {
        // CGLIB动态代理
//        JDKDog cat = (JDKDog) new MyCglibProxy().getInstance(JDKDog.class);
//        cat.sayHello();
        JDKDog jdkDog = new JDKDog();
        System.out.println(JSON.toJSONString(jdkDog, SerializerFeature.WriteMapNullValue));

        List<Integer> list = new ArrayList<Integer>();
        list.add(IgnoreStepDict.PROMOTIONIGNORE);//不过促销
        list.add(IgnoreStepDict.STOCKIGNORE); //不过库存
        list.add(IgnoreStepDict.ORDERTYPEIGNORE); //以传过来的订单类型为准
        list.add(IgnoreStepDict.PAYMENTIGNORE); //以传过来的支付方式为准
        list.add(IgnoreStepDict.SHIPMENTIGNORE); // 不过配送方式
        list.add(IgnoreStepDict.ADDRESSIGNORE); //不过地址
        list.add(IgnoreStepDict.FREIGHTIGNORE); //没有运费，传值0
        list.add(IgnoreStepDict.ORGIDIGNORE); //机构号以传过来的为准
        list.add(IgnoreStepDict.PAYPASSWORDIGNORE); //不过支付密码
        list.add(IgnoreStepDict.PRODUCTPROPERTYIGNORE); //不过商品属性，不再调用商品接口，填充商品的特殊属性，商家信息，以客户端填充CartVO为准
        list.add(IgnoreStepDict.NON_JING_AREA_SHIPMENT); //非京配区域的配送方式则不卡下单，如果传递过来的是京配，但是地址不支持京配，下单会重置成京配三方
        list.add(IgnoreStepDict.XUNILIUCHENG); //虚拟流程，虚拟商品流程标示
        list.add(IgnoreStepDict.INVOICEIGNORE); //不过发票check，下单不校验发票信息，客户端做好相关数据的校验
        list.add(IgnoreStepDict.BIGITEM); //不过大家电
        list.add(IgnoreStepDict.STOREID); //不过仓储，指定库房id

        System.out.println(list);
    }
}
